当前位置:  开发笔记 > 小程序 > 正文

Haskell中{ - ## - }的目的

如何解决《Haskell中{-##-}的目的》经验,为你挑选了2个好方法。

我正在通过Haskell代码看看我如何编写类似的流融合函数,我注意到一个有趣的语法结构,{ - #...# - },我没有遇到过; 所以我想知道它是什么以及如何找出它是如何工作的:

-- | /O(n)/ Drop elements that do not satisfy the predicate
filter :: Vector v a => (a -> Bool) -> v a -> v a
{-# INLINE filter #-}
filter f = unstream . inplace (MStream.filter f) . stream

更具体地说,具体线路做什么?

{-# INLINE filter #-}

J. Abrahamso.. 11

GHC有一个"pragma"系统,允许您为GHC指定语言外信息.特别是,他们看起来像

{-#   #-}

您将看到的最常见的是语言扩展编译指示,它必须位于文件的顶部,并影响对文件其余部分有效的语言扩展.

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Example where

通常情况下,忽略编译指示不应该影响程序的含义.这对于pragma来说是广泛的,INLINE因为它们只是提示编译器,无论在哪里调用此函数的主体都应该内联,以便开辟新的优化机会.Haskell语义为我们提供了关于何时这种内联转换不会改变程序含义的保证,因此编译器选择是否内联对程序的含义没有影响(只要它不违反程序的含义)这些保证的假设).

LANGUAGE编译指示是,他们明确指定被写在该文件的其余部分是什么语言有点不同.例如,我们通常假设的基本语言是Haskell98Haskell2010LANGUAGE编译指示添加的扩展名,该文件与前面头球列举的语言

Haskell2010 + RankNTypes + FlexibleInstances + ScopedTypeVariables

但除了暗示编译器正在编写哪种语言之外,这些编译指示没有其他意义.


完整的允许pragma集取决于所使用的编译器.此处列出了GHC的编译指示(请注意,此链接适用于版本7.6.3,而注释中的链接适用于7.0.3).使用非编译指示LANGUAGE可能是粗略的和平台特定的,因此请仔细了解它们的用法和含义.

例如,关于图书馆作者是否应该使用的问题存在很大的争论,INLINE因为它往往暗示对GHC自己的内联启发式缺乏信心,因此我们应该花更多的精力来收紧这些,而不是用手册来INLINE乱码.但是,如果明智地使用INLINE,INLINABLE可以对紧密的内环产生深远的影响.



1> J. Abrahamso..:

GHC有一个"pragma"系统,允许您为GHC指定语言外信息.特别是,他们看起来像

{-#   #-}

您将看到的最常见的是语言扩展编译指示,它必须位于文件的顶部,并影响对文件其余部分有效的语言扩展.

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Example where

通常情况下,忽略编译指示不应该影响程序的含义.这对于pragma来说是广泛的,INLINE因为它们只是提示编译器,无论在哪里调用此函数的主体都应该内联,以便开辟新的优化机会.Haskell语义为我们提供了关于何时这种内联转换不会改变程序含义的保证,因此编译器选择是否内联对程序的含义没有影响(只要它不违反程序的含义)这些保证的假设).

LANGUAGE编译指示是,他们明确指定被写在该文件的其余部分是什么语言有点不同.例如,我们通常假设的基本语言是Haskell98Haskell2010LANGUAGE编译指示添加的扩展名,该文件与前面头球列举的语言

Haskell2010 + RankNTypes + FlexibleInstances + ScopedTypeVariables

但除了暗示编译器正在编写哪种语言之外,这些编译指示没有其他意义.


完整的允许pragma集取决于所使用的编译器.此处列出了GHC的编译指示(请注意,此链接适用于版本7.6.3,而注释中的链接适用于7.0.3).使用非编译指示LANGUAGE可能是粗略的和平台特定的,因此请仔细了解它们的用法和含义.

例如,关于图书馆作者是否应该使用的问题存在很大的争论,INLINE因为它往往暗示对GHC自己的内联启发式缺乏信心,因此我们应该花更多的精力来收紧这些,而不是用手册来INLINE乱码.但是,如果明智地使用INLINE,INLINABLE可以对紧密的内环产生深远的影响.



2> leftaroundab..:

这是一个pragma.它基本上是语言标准本身无法表达的东西,但仍然在说与编译器相关的东西.

这些pragma中的一些基本上是可选的,例如提高性能,因此具有类似注释的外观.在你的例子中,INLINE意味着编译器应该努力不仅仅链接到有问题的函数,而是实际上在它被调用的任何地方"硬编码".这原则上不会改变程序语义,但会对性能和内存使用产生相当大的影响(特别是如果与额外的流融合等技术相结合).

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有